package Servlets;

import Estructuras.Principales.TarryPrincipal;
import Herramientas.FileEngine;
import Herramientas.Herramientas;
import Herramientas.RedireccionPOPUP;
import SistemaDTOS.UsersDTO;
import TarryDAOS.CarteraVencidaDAO;
import TarryDAOS.ClientesDAO;
import TarryDAOS.ProductosVentaDAO;
import TarryDAOS.TarryClientesDAO;
import TarryDAOS.TarryItemsPedidoDAO;
import TarryDAOS.TarryPedidosDAO;
import TarryDAOS.TarryProductosDAO;
import TarryDTOS.ClientesDTO;
import TarryDTOS.TarryItemPedidoDTO;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 *
 * @author Mauricio Alan
 */
@WebServlet(name = "TarrySystem", urlPatterns = {"/TarrySystem"})
public class TarrySystem extends HttpServlet {

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {
            ClientesDAO clientes = new ClientesDAO();
            HttpSession session = request.getSession();
            Vector errores = new Vector();
            Herramientas herramientas = new Herramientas();
            String action = new String();
            action = request.getParameter("action");
            UsersDTO usuarioLogeado = (UsersDTO) session.getAttribute("userUpDTO");

            TarryPedidosDAO pedidosDAO = new TarryPedidosDAO();
            TarryClientesDAO clientesDAO = new TarryClientesDAO();
            TarryItemsPedidoDAO itemsDAO = new TarryItemsPedidoDAO();

            TarryProductosDAO productosDAO = new TarryProductosDAO();

            TarryPrincipal principal = new TarryPrincipal();

// #.# INICIO DEL MODULO (PARTE DEL DASHBOARD ADMIN)
            principal.setUser(usuarioLogeado);
            if (action.equals("principal")) {
                errores.clear();
                principal.setErrores(errores);
                principal.setnErrores(errores.size());
                principal.setPedidos(pedidosDAO.pedidosPorVendedor(usuarioLogeado.getId()));
                session.setAttribute("principalTarry", principal);
                RequestDispatcher d = request.getRequestDispatcher("TarryJSP/dash.jsp");
                d.forward(request, response);

// #.# MODULO DE ITEMS (PRODUCTOS DEL PEDIDO)   
            } else if (action.equals("nuevoPedido")) {
                int index = Integer.parseInt(request.getParameter("index"));
                switch (index) {
                    case 1:
                        Vector vClientes = clientes.todosClientes();
                        principal.setClientes(vClientes);
// MUESTRO EL JSP DE NUEVO PEDIDO
                        // se genera un id aleatorio de pedido
                        int folioPedido = herramientas.enteroAleatorio(5);
                        errores.clear();
                        principal.setErrores(errores);
                        principal.setnErrores(errores.size());
                        principal.setIdPedido(folioPedido);
                        session.setAttribute("tarryPrincipal", principal);
                        RequestDispatcher d = request.getRequestDispatcher("TarryJSP/nuevoPedido.jsp");
                        d.forward(request, response);
                        break;
                    case 2:

// RECUPERO LOS DATOS
                        int idCliente = 0;
                        int idPedido = 0;
                        int idUsuario = Integer.parseInt(request.getParameter("idUser"));
                        // SE AGREGA EL CAMPO DE TIPO COMPROBANTE 
                        int tipoComprobante = 0;
                        if (request.getParameter("idCliente").toString().length() > 0) {
                            idCliente = Integer.parseInt(request.getParameter("idCliente"));
                        } else {
                            errores.add("SELECCIONE A UN CLIENTE ");
                        }

                        if (request.getParameter("idPedido").toString().length() > 0) {
                            idPedido = Integer.parseInt(request.getParameter("idPedido"));
                        } else {
                            errores.add("Ingrese el ID del Pedido");
                        }

                        if (request.getParameter("tipoComprobante").toString().length() > 0) {
                            tipoComprobante = Integer.parseInt(request.getParameter("tipoComprobante"));
                            if (tipoComprobante == 0) {
                                errores.add("Seleccione Un tipo De Comprobante Factura/Remision");
                            }
                        } else {
                            errores.add("Seleccione el Tipo de Comprobante Remision / Factura");
                        }

// AGREGO LA BANDERA DE CREDITO Y EL CAMPO DE NUMERO DE DIAS
                        // pagoBandera | diasCredito
                        int pagoBandera = Integer.parseInt(request.getParameter("pagoBandera"));
                        int diasCredito = 0;

                        if (pagoBandera == 0) {
                            // pedido es de contado
                            diasCredito = 0;
                        } else if (pagoBandera > 0) {
                            // el pedido es con plazo a credito 
                            diasCredito = Integer.parseInt(request.getParameter("diasCredito"));
                        }

// AGREGO LA BANDERA DE CREDITO Y EL CAMPO DE NUMERO DE DIAS
                        if (errores.size() == 0) {
                            CarteraVencidaDAO credito = new CarteraVencidaDAO();
                            pedidosDAO.nuevoPedido(idUsuario, idCliente, idPedido, tipoComprobante);
                            errores.clear();
                            principal.setErrores(errores);
                            principal.setnErrores(errores.size());
                            principal.setPedidos(pedidosDAO.pedidosPorVendedor(usuarioLogeado.getId()));
                            session.setAttribute("principalTarry", principal);

                            if (pagoBandera > 0) {
                                credito.pedidoCredito(idCliente, idPedido, diasCredito);
                            }
                            // SE AGREGA EL REGISTRO DEL CREDITO DEL PEDIDO EN CASO DE QUE ESTE HAYA SIDO INGRESADO
                            RedireccionPOPUP redireccion = new RedireccionPOPUP();
                            redireccion.setServicio("TarrySystem?action=principal");
                            session.setAttribute("sistema", redireccion);

// EMAIL DE PEDIDO A ALMACEN 
//                            MailMotor email = new MailMotor();
//                            email.sendMail(
//                                    100,
//                                    "NUEVO PEDIDO REGISTRADO",
//                                    " UN NUEVO PEDIDO HA SIDO INGRESADO EN EL SISTEMA FAVOR DE DAR SEGUIMIENTO"
//                                    + " EL ID DE PEDIDO ES EL SIGUIENTE: " + idPedido
//                                    + " http://192.168.1.200:8080/ERP "
//                            );
// EMAIL DE PEDIDO A ALMACEN 
                            RequestDispatcher e = request.getRequestDispatcher("./loading.jsp");
                            e.forward(request, response);
                        } else if (errores.size() > 0) {
                            TarryPrincipal principal2 = (TarryPrincipal) session.getAttribute("tarryPrincipal");
                            principal2.setErrores(errores);
                            principal2.setnErrores(errores.size());
                            session.setAttribute("tarryPrincipal", principal2);
                            RequestDispatcher e = request.getRequestDispatcher("TarryJSP/nuevoPedido.jsp");
                            e.forward(request, response);
                        }
                        break;
                    case 3:
                        // ELIMINA PEDIDOS /TarrySystem?action=nuevoPedido&index=3&subIndex=2
                        int subIndex = Integer.parseInt(request.getParameter("subIndex"));
                        switch (subIndex) {
                            case 1:
                                // MUESTRO EL JSP DE CONFIRMACION
                                int idRecord = Integer.parseInt(request.getParameter("idRecord"));
                                session.setAttribute("idRecordApuntador", idRecord);
                                String servicioEliminaRecords = "./TarrySystem?action=nuevoPedido&index=3&subIndex=2";
                                session.setAttribute("tarryServiceDeleteRecord", servicioEliminaRecords);
                                RequestDispatcher f = request.getRequestDispatcher("TarryJSP/popUpAvisoEliminar.jsp");
                                f.forward(request, response);
                                break;
                            case 2:
                                // ELIMINO EL REGISTRO
                                int idRecordApuntadorSesionDownload = (Integer) session.getAttribute("idRecordApuntador");
                                pedidosDAO.eliminarPedido(idRecordApuntadorSesionDownload);
                                RedireccionPOPUP redireccion = new RedireccionPOPUP();
                                redireccion.setServicio("TarrySystem?action=principal");
                                session.setAttribute("sistema", redireccion);
                                RequestDispatcher g = request.getRequestDispatcher("./loading.jsp");
                                g.forward(request, response);
                                break;
                        }
                        break;
                }
// #.#  MODULO DE FILTRADO DE PEDIDOS  
            } else if (action.equals("filtroPedidos")) {
                errores.clear();
                int idVendedor = usuarioLogeado.getId();
                // SE GENERA UNA BUSQUEDA DEL PEDIDO (GENERARDOS CON EL PERFL DE VENDENDOR)
                if (request.getParameter("idPedido").toString().length() > 0 && request.getParameter("idCliente").toString().length() == 0) {
                    int idPedido = Integer.parseInt(request.getParameter("idPedido"));
                    Vector vPedido = new Vector();
                    vPedido = pedidosDAO.pedidosPorVendedorPorIdPedido(idVendedor, idPedido);
                    principal.setErrores(errores);
                    principal.setPedidos(vPedido);
                    session.setAttribute("principalTarry", principal);
                    RequestDispatcher d = request.getRequestDispatcher("TarryJSP/dash.jsp");
                    d.forward(request, response);
                } // SE GENERA LA BUSQUEDA DE LOS PEDIDOS DE UN CLIENTE CLIENTE (GENERARDOS CON EL PERFL DE VENDENDOR)
                else if (request.getParameter("idPedido").toString().length() == 0 && request.getParameter("idCliente").toString().length() > 0) {
                    int idCliente = Integer.parseInt(request.getParameter("idCliente"));
                    Vector vPedido = new Vector();
                    vPedido = pedidosDAO.pedidosPorVendedorPorIdCliente(idVendedor, idCliente);
                    principal.setErrores(errores);
                    principal.setPedidos(vPedido);
                    session.setAttribute("principalTarry", principal);
                    RequestDispatcher d = request.getRequestDispatcher("TarryJSP/dash.jsp");
                    d.forward(request, response);
                } // SE CARGAN TODOS LOS PEDIDOS DEL VENDEDOR) (GENERARDOS CON EL PERFL DE VENDENDOR)
                else if (request.getParameter("idPedido").toString().length() == 0 && request.getParameter("idCliente").toString().length() == 0) {
                    RequestDispatcher d = request.getRequestDispatcher("./TarrySystem?action=principal");
                    d.forward(request, response);
                }

            } // #.# MODULO DE ITEMS (PRODUCTOS DEL PEDIDO)
            else if (action.equals("items")) {
                int index = Integer.parseInt(request.getParameter("index"));
                switch (index) {
                    case 1:
                        // MUESTRO EL FORMULARIO PRINCIPAL DE ITEMS DEL PEDIDO
                        errores.clear();
                        int idPedido = Integer.parseInt(request.getParameter("idPedido"));
                        int idCliente = Integer.parseInt(request.getParameter("idCliente"));

                        principal.setItemsPedido(itemsDAO.itemsPorPedido(idPedido));

                        principal.setErrores(errores);
                        principal.setnErrores(errores.size());

                        principal.setTotalItems(itemsDAO.totalItems(idPedido));
                        principal.setIdPedido(idPedido);

                        session.setAttribute("idPedidoApuntador", idPedido);
                        session.setAttribute("idClienteApuntador", idCliente);
                        session.setAttribute("tarryPrincipal", principal);

                        RequestDispatcher a = request.getRequestDispatcher("TarryJSP/items.jsp");
                        a.forward(request, response);
                        break;
                    case 2:
                        // MUESTRO EL FORMULARIO POP UP DEL NUEVO ITEM 
                        // arreglando
                        TarryPrincipal principal2 = new TarryPrincipal();
                        int idClienteDescuentos = Integer.parseInt(request.getParameter("idCliente"));
                        errores.clear();
                        Vector vProductos = new Vector();
                        ProductosVentaDAO productoVentaDAO = new ProductosVentaDAO();
                        vProductos = productoVentaDAO.todoProducto();
                        principal.setProductos(vProductos);
                        principal2.setProductos(vProductos);

                        principal.setErrores(errores);
                        principal.setnErrores(errores.size());
                        principal.setIdClienteApuntador(idClienteDescuentos);
                        principal2.setErrores(errores);
                        principal2.setnErrores(errores.size());
                        principal2.setIdClienteApuntador(idClienteDescuentos);

                        ClientesDTO clienteDTO = new ClientesDTO();
                        ClientesDAO clienteDAO = new ClientesDAO();

                        clienteDTO = clienteDAO.clientesDTO(idClienteDescuentos);

                        principal2.setClienteDTOs(clienteDTO);

                        // SE CARGAN LOS DESCUENTOS ASIGNADOS A LA INTERFAZ //
                        session.setAttribute("tarryPrincipal", principal2);
                        RequestDispatcher b = request.getRequestDispatcher("TarryJSP/nuevoItem.jsp");
                        b.forward(request, response);
                        break;
                    case 3:
                        // RECUPERO DATOS DEL POPO NUEVO ITEM
                        errores.clear();
                        int idPedidoApuntador = (Integer) session.getAttribute("idPedidoApuntador");

                        int idProducto = 0;
                        int nCorrugados = 0;
                        double pCorrugado = 0;
                        double descuento1 = 0;
                        double descuento2 = 0;
                        double descuento3 = 0;
                        int idPedidoApuntadorExterno = Integer.parseInt(request.getParameter("idPedido"));
                        ;

                        TarryItemPedidoDTO item = new TarryItemPedidoDTO();

                        if (request.getParameter("idProducto").toString().length() > 0) {
                            idProducto = Integer.parseInt(request.getParameter("idProducto"));
                            item.setIdProducto(idProducto);
                        } else {
                            errores.add("El Campo Id Producto Es Obligatorio");
                        }

// SE AGREGA LA VALIDACION DE QUE NO PUEDE EXISTIR UN MISMO ITEM DENTRO DEL MISMO PRODUCTO
                        TarryItemsPedidoDAO itemsPedido = new TarryItemsPedidoDAO();
                        int banderaExisteItemPedido = itemsPedido.banderaExisteItemProducto(idPedidoApuntadorExterno, idProducto);
                        System.out.println("banderaExisteItemPedido == " + banderaExisteItemPedido);
                        if (banderaExisteItemPedido >= 1) {
                            errores.add("NO SE PUEDE INGRESAR EL MISMO ITEM MAS DE UNA VEZ EN UN MISMO PEDIDO");
                            errores.add("SI LO CONSIDERA NECESARIO ELIME EL PRODUCTO E INGRESELO NUEVAMENTE");
                        } 
// SE AGREGA LA VALIDACION DE QUE NO PUEDE EXISTIR UN MISMO ITEM DENTRO DEL MISMO PRODUCTO

                        if (request.getParameter("nCorrugados").toString().length() > 0) {
                            nCorrugados = Integer.parseInt(request.getParameter("nCorrugados"));
                            item.setCantidadCorrugados(nCorrugados);
                        } else {
                            errores.add("El Campo Numero de Corrugados es obligatorio");
                        }

                        if (request.getParameter("pCorrugados").toString().length() > 0) {
                            pCorrugado = Double.parseDouble(request.getParameter("pCorrugados"));
                            item.setPrecionAsignadoCorrugado(pCorrugado);
                        } else {
                            errores.add("El Campo Numero de Unidades");
                        }

                        // VALIDACION DE DESCUNTOS
                        if (request.getParameter("decuentoItem1").toString().length() > 0) {
                            descuento1 = Double.parseDouble(request.getParameter("decuentoItem1"));
                            item.setDescuentoItem1(descuento1);
                        } else {
                            item.setDescuentoItem1(0);
                        }

                        if (request.getParameter("decuentoItem2").toString().length() > 0) {
                            descuento2 = Double.parseDouble(request.getParameter("decuentoItem2"));
                            item.setDescuentoItem2(descuento2);
                        } else {
                            item.setDescuentoItem2(0);
                        }

                        if (request.getParameter("decuentoItem3").toString().length() > 0) {
                            descuento3 = Double.parseDouble(request.getParameter("decuentoItem3"));
                            item.setDescuentoItem3(descuento3);
                        } else {
                            item.setDescuentoItem3(0);
                        }

                        // SE TIENE QUE BUSCA SI EXISTE EN CATALOGO DE PRODUCTOS EL ID INGRESADO
                        if (errores.size() == 0) {

                            TarryPrincipal principal3 = (TarryPrincipal) session.getAttribute("tarryPrincipal");
                            item.setIdPedido(idPedidoApuntador);
                            itemsDAO.agregarItemPedido(item);

                            RedireccionPOPUP redireccion = new RedireccionPOPUP();
                            redireccion.setServicio("./TarrySystem?action=items");
                            redireccion.setVariables("index=1");
                            redireccion.setVariables2("idPedido=" + idPedidoApuntador);
                            redireccion.setVariables3("idCliente=" + principal3.getIdClienteApuntador());

                            session.setAttribute("sistema", redireccion);
                            RequestDispatcher e = request.getRequestDispatcher("./loading.jsp");
                            e.forward(request, response);

                        } else if (errores.size() > 0) {
                            principal.setErrores(errores);
                            principal.setnErrores(errores.size());
                            session.setAttribute("tarryPrincipal", principal);
                            RequestDispatcher c = request.getRequestDispatcher("TarryJSP/nuevoItem.jsp");
                            c.forward(request, response);
                        }
                        break;
                    case 4:
                        // ELIMINA ITEMS ELIMINA PRODUCTOS DEL PEDIDO
                        int subIndex = Integer.parseInt(request.getParameter("subIndex"));

                        switch (subIndex) {
                            case 1:
                                // MUESTRO EL JSP DE CONFIRMACION
                                int idPedido2 = Integer.parseInt(request.getParameter("idPedido"));
                                int idRecordItem = Integer.parseInt(request.getParameter("idRecordItem"));
                                session.setAttribute("idRecordPedidoApuntador", idPedido2);
                                session.setAttribute("idRecordItemApuntador", idRecordItem);
                                String servicioEliminaRecords = "./TarrySystem?action=items&index=4&subIndex=2";
                                session.setAttribute("tarryServiceDeleteRecord", servicioEliminaRecords);
                                RequestDispatcher f = request.getRequestDispatcher("TarryJSP/popUpAvisoEliminar.jsp");
                                f.forward(request, response);
                                break;
                            case 2:
                                System.out.println("SI ENTRO A BORRAR ITEM DEL PEDIDO");
                                //TarrySystem?action=items&index=4&subIndex=2
                                int idRecordPedidoApuntadorSesionDownload = (Integer) session.getAttribute("idRecordPedidoApuntador");
                                int idRecordApuntadorSesionDownload = (Integer) session.getAttribute("idRecordItemApuntador");
                                //BORRANDO ITEM
                                itemsDAO.eliminarItemPedido(idRecordPedidoApuntadorSesionDownload, idRecordApuntadorSesionDownload);
                                //BORRANDO ITEM
                                RedireccionPOPUP redireccion = new RedireccionPOPUP();
                                redireccion.setServicio("TarrySystem?action=items");
                                redireccion.setVariables("index=1");
                                redireccion.setVariables2("idPedido=" + idRecordPedidoApuntadorSesionDownload);
                                session.setAttribute("sistema", redireccion);
                                RequestDispatcher g = request.getRequestDispatcher("./loading.jsp");
                                g.forward(request, response);
                                break;
                        }
                        break;
                }
            } //#.# MODULO DE PROVEEDORES            
            else if (action.equals("proveedores")) {

            } //#.# MODULO DE CLIENTES            
            else if (action.equals("clientes")) {

            } //#.# MODULO DE PRODUCTOS
            else if (action.equals("productos")) {
                int index = Integer.parseInt(request.getParameter("index"));
                switch (index) {
                    case 1:
                        // ## MUESTRO EL JSP DE MAIN
                        errores.clear();
                        principal.setErrores(errores);
                        principal.setnErrores(errores.size());
                        Vector productos = productosDAO.todoProducto();
                        principal.setProductos(productos);
                        session.setAttribute("tarryPrincipal", principal);
                        RequestDispatcher f = request.getRequestDispatcher("TarryJSP/productosDash.jsp");
                        f.forward(request, response);
                        break;
                    case 2:
                        int subIndex = Integer.parseInt(request.getParameter("subIndex"));
                        switch (subIndex) {
                            case 1:// MUESTRO EL JSP DE NUEVO PRODUCTO
                                errores.clear();
                                principal.setErrores(errores);
                                principal.setnErrores(errores.size());
                                session.setAttribute("tarryPrincipal", principal);
                                RequestDispatcher g = request.getRequestDispatcher("TarryJSP/nuevoProducto.jsp");
                                g.forward(request, response);
                                break;
                            case 2:// RECUPERO DATOS DEL JSP
                                break;
                        }
                        break;
                }
                // #.# TARRY QUICK RESPONSE
            } else if (action.equals("QRGen")) {
                int index = Integer.parseInt(request.getParameter("index"));
                FileEngine fe = new FileEngine();
                switch (index) {
                    case 1:
                        principal.setUrlQR("");
                        session.setAttribute("tarryPrincipal", principal);
                        RequestDispatcher f = request.getRequestDispatcher("TarryJSP/QRGen.jsp");
                        f.forward(request, response);
                        break;
                    case 2:
                        String qrValue = "";
                        String urlQR = "";
                        principal.setUrlQR("");
                        if (request.getParameter("qrValue").toString().length() > 0) {
                            qrValue = request.getParameter("qrValue");
                            try {
                                urlQR = fe.qr(qrValue);
                            } catch (Exception ex) {
                                Logger.getLogger(Login.class.getName()).log(Level.SEVERE, null, ex);
                            }
                            principal.setUrlQR(urlQR);
                            session.setAttribute("tarryPrincipal", principal);
                            RequestDispatcher onOK = request.getRequestDispatcher("TarryJSP/QRGen.jsp");
                            onOK.forward(request, response);
                        } else {
                            RequestDispatcher onError = request.getRequestDispatcher("TarryJSP/QRGen.jsp");
                            onError.forward(request, response);
                        }
                        break;
                }
                // #.# TARRY MODULO DE AYUDA               
            } else if (action.equals("tarryHelp")) {
                RequestDispatcher f = request.getRequestDispatcher("TarryJSP/helpDesk.jsp");
                f.forward(request, response);
            }
        } finally {
            out.close();
        }
    }
    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /**
     * Handles the HTTP <code>GET</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Handles the HTTP <code>POST</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Returns a short description of the servlet.
     *
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>

}
